/**
 * Copyright (C), 2015-2018, XXX有限公司
 * FileName: MainConfig
 * Author:   zhouheng
 * Date:     2018/5/24 9:56
 * Description: 注解测试1
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.zhou.annotation.config;

import com.zhou.annotation.bean.Color;
import com.zhou.annotation.bean.ColorFactoryBean;
import com.zhou.annotation.bean.Person;
import com.zhou.annotation.bean.Red;
import com.zhou.annotation.condition.LinuxCondition;
import com.zhou.annotation.condition.MyImportSelector;
import com.zhou.annotation.condition.WindowsCondition;
import jdk.nashorn.internal.objects.annotations.ScriptClass;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;
import org.springframework.context.annotation.ComponentScan.Filter;

/**
 * 〈一句话功能简述〉<br> 
 * 〈注解测试1〉
 *
 * @author zhouheng
 * @create 2018/5/24
 * @since 1.0.0
 */
//默认是单实例的
/**
 * ConfigurableBeanFactory#SCOPE_PROTOTYPE
 * @see ConfigurableBeanFactory#SCOPE_SINGLETON
 * @return\
 * @Scope:调整作用域
 * prototype：多实例的：ioc容器启动并不会去调用方法创建对象放在容器中。
 * 					每次获取的时候才会调用方法创建对象；
 * singleton：单实例的（默认值）：ioc容器启动会调用方法创建对象放到ioc容器中。
 * 			以后每次获取就是直接从容器（map.get()）中拿，
 * request：同一次请求创建一个实例
 * session：同一个session创建一个实例
 *
 * 懒加载：
 * 		单实例bean：默认在容器启动的时候创建对象；
 * 		懒加载：容器启动不创建对象。第一次使用(获取)Bean创建对象，并初始化；
 *
 */
//@Configuration
@Import(value = MyImportSelector.class)
public class MainConfig2 {

    /**
     * 条件注解
     */
    @Bean("bill")
//    @Conditional(value = WindowsCondition.class)
    public Person person1(){
        return new Person("bill",43);
    }

    /**
     * 条件注解
     */
    @Bean("blunx")
    @Conditional(value = LinuxCondition.class)
    public Person person2(){
        return new Person("blnux",66);
    }

    @Bean(value = "person02")
    public Person person(){
        System.out.println("lanjiazai");
        Person person = new Person("zhangsan",14);

        return person;
    }

    /**
     * 给容器中注册组件；
     * 1）、包扫描+组件标注注解（@Controller/@Service/@Repository/@Component）[自己写的类]
     * 2）、@Bean[导入的第三方包里面的组件]
     * 3）、@Import[快速给容器中导入一个组件]
     * 		1）、@Import(要导入到容器中的组件)；容器中就会自动注册这个组件，id默认是全类名
     * 		2）、ImportSelector:返回需要导入的组件的全类名数组；
     * 		3）、ImportBeanDefinitionRegistrar:手动注册bean到容器中
     * 4）、使用Spring提供的 FactoryBean（工厂Bean）;
     * 		1）、默认获取到的是工厂bean调用getObject创建的对象
     * 		2）、要获取工厂Bean本身，我们需要给id前面加一个&
     * 			&colorFactoryBean
     */
    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }

}